const xml2js=require('xml2js');  //解析xml变一个对象工具



parseXml={
    parseXMLAsync(xml){   //解析xml为对象
        return new Promise((resolve,reject)=>{
    //trim（默认值false：）：修剪文本节点开头和结尾的空格。解析xml工具参数2还有很多可选功能，参考官网
            xml2js.parseString(xml,{trim:true},(err,content)=>{
                if (err){
                    reject(err);
                    return
                }
                resolve(content)
            })
        })
    },
    //解析到对象初始化，因为对象属性有空属性，或者数组，或属性又是一个对象需要展开
    formatMsg(result){
        let msg={};

        if (typeof result==='object') {  //因为xml工具解析回的对象不正规，所以此方法转化正规
            let keys=Object.keys(result)
            for (var i = 0; i < keys.length; i++) {
                let item = result[keys[i]];
                let key=keys[i];

                if (item instanceof Array && item.length>1) {   //如果是多个子集的数组
                    msg[key]=[];  //如果多个子集数组则将当前属性key变为数组
                    for (var j = 0; j < item.length; j++) {
                        //将数组遍历，下面就是将一个值一个值调用自己函数push进去  当前属性key数组
                        msg[key].push(this.formatMsg(item[j]))  //传入一个值时自然不进这，而且进下面item.length===1

                    }
                } else if(item.length===1){  //如果数组包含一个子集，可能是一个值或一个对象或一个空字符
                    //三目判断msg[key]赋值哪个，如果是对象就用传给函数自己再展开/解析，赋值给当前属性。否则是一个值赋给当前属性
                    msg[key]=((typeof item[0]==='object')?this.formatMsg(item[0]):(item[0]||'').trim())
                    //(item[0]||'')是判断一个值或空字符。.trim()是去前面后面空格
                    // 注意this.formatMsg封装在对象中要+this，独立函数就可formatMsg()调用自己
                }

            }
        }
        return msg

    }
};
module.exports=parseXml;